#include <stdio.h>
#include <type_traits>

int main()
{
    printf("\n=== Testing const modifiers ===\n");
    // const 修饰符测试
    // 预期结果: 1 (true)  - 因为 add_const<int>::type 就是 const int
    printf("add_const<int> is const int: %d\n",
           std::is_same<const int, std::add_const<int>::type>::value);
    // 预期结果: 1 (true)  - 因为 remove_const<const int>::type 移除 const 后就是 int
    printf("remove_const<const int> is int: %d\n",
           std::is_same<int, std::remove_const<const int>::type>::value);

    printf("\n=== Testing reference modifiers ===\n");
    // 引用修饰符测试
    // 预期结果: 1 (true)  - 因为 add_lvalue_reference<int>::type 就是 int&
    printf("add_lvalue_reference<int> is int&: %d\n",
           std::is_same<int &, std::add_lvalue_reference<int>::type>::value);
    // 预期结果: 1 (true)  - 因为 add_rvalue_reference<int>::type 就是 int&&
    printf("add_rvalue_reference<int> is int&&: %d\n",
           std::is_same<int &&, std::add_rvalue_reference<int>::type>::value);
    // 预期结果: 1 (true)  - 因为 remove_reference<int&>::type 移除引用后就是 int
    printf("remove_reference<int&> is int: %d\n",
           std::is_same<int, std::remove_reference<int &>::type>::value);
    // 预期结果: 1 (true)  - 因为 remove_reference<int&&>::type 移除引用后就是 int
    printf("remove_reference<int&&> is int: %d\n",
           std::is_same<int, std::remove_reference<int &&>::type>::value);

    printf("\n=== Testing pointer modifiers ===\n");
    // 指针修饰符测试
    // 预期结果: 1 (true)  - 因为 add_pointer<int>::type 就是 int*
    printf("add_pointer<int> is int*: %d\n",
           std::is_same<int *, std::add_pointer<int>::type>::value);

    printf("\n=== Testing array modifications ===\n");
    // 数组维度测试
    // 预期结果: 1 (true)  - 因为 remove_extent<int[]>::type 移除一维后就是 int
    printf("remove_extent<int[]> is int: %d\n",
           std::is_same<int, std::remove_extent<int[]>::type>::value);
    // 预期结果: 1 (true)  - 因为 remove_extent<int[][2]>::type 移除一维后是 int[2]
    printf("remove_extent<int[][2]> is int[2]: %d\n",
           std::is_same<int[2], std::remove_extent<int[][2]>::type>::value);
    // 预期结果: 1 (true)  - 因为 remove_extent<int[][2][3]>::type 移除一维后是 int[2][3]
    printf("remove_extent<int[][2][3]> is int[2][3]: %d\n",
           std::is_same<int[2][3], std::remove_extent<int[][2][3]>::type>::value);

    // 移除所有数组维度
    // 预期结果: 1 (true)  - 因为 remove_all_extents<int[][2][3]>::type 移除所有维度后就是 int
    printf("remove_all_extents<int[][2][3]> is int: %d\n",
           std::is_same<int, std::remove_all_extents<int[][2][3]>::type>::value);

    printf("\n=== Testing common type ===\n");
    // 公共类型测试
    // 预期结果: 1 (true)  - 因为 unsigned char, short 和 int 的公共类型是 int
    typedef std::common_type<unsigned char, short, int>::type NumericType;
    printf("common_type of unsigned char, short, int is int: %d\n",
           std::is_same<int, NumericType>::value);

    // 编译期断言
    static_assert(std::is_same<const int, std::add_const<int>::type>::value,
                  "add_const should work");
    static_assert(std::is_same<int, std::remove_const<const int>::type>::value,
                  "remove_const should work");
    printf("All type modification assertions passed!\n");

    return 0;
}